/*
 * Copyright 2010 Michael Nitsche
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package de.mnit.basis.db.sys;

import de.mnit.basis.daten.struktur.liste.S_Liste;
import de.mnit.basis.db.konstant.DBMS;
import de.mnit.basis.db.sql.DBHilfe;
import de.mnit.basis.db.sql.S_SqlDB;
import de.mnit.basis.fehler.Fehler;
import de.mnit.basis.fehler.system.F_Programm;


/**
 * @author Michael Nitsche
 * 03.02.2008	Erstellt
 */
public class DBKonfigTab {

	private final S_DBManager db;
	private final String tab;
	private final int id_laenge, wert_laenge;
	private S_Liste<String> ids;
	private Boolean neu_angelegt=null;


	public DBKonfigTab(S_DBManager db, String tab) {
		this(db, tab, 16, 256);
	}

	public DBKonfigTab(S_DBManager db, String tab, int id_laenge, int wert_laenge) {
		Fehler.zahl.wenn_ZuKlein(1, id_laenge);
		Fehler.zahl.wenn_ZuKlein(1, wert_laenge);
		this.id_laenge=id_laenge;
		this.wert_laenge=wert_laenge;
		this.db=db;
		this.tab=tab;
		verbinden();
	}

	/*
	 * Vielleicht machts ja mal Sinn nicht gleich zu verbinden, aber momentan sehe ich nichts was dagegen spricht!
	 */
	private void verbinden() {
		boolean existiert=DBHilfe.existiert(this.db.direkt(), this.tab);
		if(!existiert)
			iErstellen();
		this.neu_angelegt=!existiert;

		this.ids=this.db.direkt().gibSpalte("SELECT id FROM "+this.tab);
	}

	public void setze(String id, String wert) {
		if(ids.kennt(id))
			iErsetzen(id, wert); //TODO Kennt über DB-Abfrage, kann sich ja zwischenzeitlich geändert haben!
		else {
			iPlus(id, wert);
			this.ids.plus(id);
		}
	}

	public void setze(String id, int wert) {
		setze(id, ""+wert);
	}

	public String gib(String id) {
		return iGib(id);
	}

	public Integer gibInt(String id) {
		String s=gib(id);
		return s==null ? null : Integer.parseInt(s);
	}

	public Boolean gNeuAngelegt() {
		return this.neu_angelegt;
	}

	// INTERN

	private void iErstellen() {
		S_SqlDB db=this.db.direkt();
		if(this.db.gDBMS()==DBMS.HSQLDB)
			db.befehl("CREATE TABLE dbsys(id VARCHAR("+id_laenge+") NOT NULL PRIMARY KEY,wert VARCHAR("+wert_laenge+"))");
		else if(this.db.gDBMS()==DBMS.MYSQL)
			db.befehl("CREATE TABLE dbsys(id VARCHAR("+id_laenge+") NOT NULL,wert VARCHAR("+wert_laenge+"), PRIMARY KEY(id))");
		else
			Fehler.sonstige.da_ToDo("DB prüfen", this.db.gDBMS());
	}

	private String iGib(String id) {
		try {
			return this.db.direkt().gibString("SELECT wert FROM "+this.tab+" WHERE id='"+id+"'");
		}
		catch(F_Programm e) {
			return null;
		}
	}

	private void iPlus(String id, String wert) {
		this.db.direkt().befehl("INSERT INTO "+this.tab+" (id,wert) VALUES ('"+id+"','"+wert+"')");
	}

	private void iErsetzen(String id, String wert) {
		this.db.direkt().befehl("UPDATE "+this.tab+" SET wert='"+wert+"' WHERE id='"+id+"'");
	}

}
